//
//  MainViewController.m
//  UI15_XML_JSON数据结构解析
//
//  Created by Scott on 15/5/15.
//  Copyright (c) 2015年 www.lanou3g.com 蓝欧3G. All rights reserved.
//

#import "MainViewController.h"
#import "SecondViewController.h"
#import "SaxXMLHandler.h"
#import "DOMXMLHandler.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"XML Parse";
    self.view.backgroundColor = [UIColor whiteColor];
    
    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"JSON" style:UIBarButtonItemStylePlain target:self action:@selector(rightClicked:)] autorelease];
    
    [self saxXMLHandler];
    
    [self domXMLHandler];
    
    
}

#pragma mark - 知识点1 XML Parse (XML 解析)
/**
 * @brief 讲解:
 *
 * Parse(解析): 从事先规定好的格式中提取数据. 
 * 解析的前提: 提前约定好格式. 数据提供方按照格式提供数据, 数据获取方按照格式获取数据
 *
 * iOS 开发中常见的解析: XML解析, JSON解析
 *
 * XML: Extensible Markup language (可扩展标记语言), 主流数据格式之一, 可以用来存储和传输数据
 *
 * XML数据格式的功能: 数据交换, 内存管理, 用作配置文件
 *
 * XML数据结构的语法
    声明
    节点使用一对标签标示<>. 分起始和结束标签 < > 和 </ >
    根节点是起始节点.只有一个.
    节点可以嵌套
    节点可以有值. 存储在一对标签中.
 */

/* 创建一个Student.xml文件 */

#pragma mark -  知识点2 SAX方式解析XML数据
/**
 * @brief 讲解:
 *
 * SAX: Simple API for XML. 基于事件驱动的解析方法, 逐行解析数据.(采用协议回调机制)
 *
 * NSXMLParse是iOS自带的XML解析类, 采用SAX方式解析数据.
 * 解析过程由NSXMLParseDelegate协议方法回调
 * 解析过程: 开始标签 -> 取值 -> 结束标签 -> 取值
 *
 * 详见: SaxXMLHandler 类
 */
- (void)saxXMLHandler
{
    SaxXMLHandler *saxHandler = [[SaxXMLHandler alloc] init];
    [saxHandler startSAXParse];
    
    NSLog(@"%@", saxHandler.arr);
    
    [saxHandler release];
    
}


#pragma mark - 知识点3 DOM方式解析XML数据 
/**
 * @brief 讲解:
 *
 * DOM:Document Object Model (文档对象模型).
 *
 * 解析时需要将XML文件整体读入, 并且将XML结构化成树状, 使用时再通过树状结构读取相关数据
 * 
 * 使用的类是第三方类:GDataXMLNode 
 * Google提供的开源XML解析类, 对libxml2.dylib 进行了Objective-C的封装
 * 采用DOM方式解析数据
 *
 * iOS 中包含一个C语言的动态链接库 libxml2.dylib , 解析速度比NSXMLParse快.
 * 
 * 详见 DOMXMLHandler 类
 */
- (void)domXMLHandler
{
    DOMXMLHandler *dom = [[DOMXMLHandler alloc] init];
    [dom startDOMParse];
    
    NSLog(@"%@", dom.arr);
    [dom release];
}



#pragma mark -
- (void)rightClicked:(UIBarButtonItem *)barButton
{
    SecondViewController *second = [[SecondViewController alloc] init];
    [self.navigationController pushViewController:second animated:YES];
    [second release];
}

#pragma mark -
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
